在一个函数声明中，const可以指的是函数的返回值，或某个参数；对于成员函数，还可以指的是整个函数。 const（1） int fun(int const（2） &) const（3）
{
    int temp;
    retrun temp;
}
参数的 const属性（上例2处）一般用引用传递，是为了保证该参数在函数中不允许被修改，一旦修改，编译器会报错。其次拓宽了引用能接收的范围，常引用作参数能接收常对象和非常对象

    而返回值的const属性（上例1处）是保证函数的返回值不被修改
        比如函数返回值是临时对象的

            上例3处是保证被调用对象的成员数据不能被修改
                如下面的代码

#include <iostream>
    using namespace std;

class A
{
public:
    A(int x, int y, int z) : a(x)
    {
        //a = x;//error  必须在初始化列表里赋值
        b = y;
        c = z;
    }

    void SHow() const
    {
        //const成员函数不被允许修改它所在对象的任何一个数据成员，即不允许修改对象的成员变量
        //a = 10;//error
        //b = 20;//error
        //const成员函数可以访问const成员变量和非const成员变量

        cout << "A::const a = " << a << endl;
        cout << "A::b = " << b << endl;
        cout << "A::c = " << c << endl;
    }

    void Show()
    {
        cout << "A::const a = " << a << endl;
        cout << "A::b = " << b << endl;
        cout << "A::c = " << c << endl;
    }

private:
    const int a;
    int b;
    int c;
};

int main()
{
    const A a(1, 2, 3); //const A *this;从而保护this指向的内容不被随意修改
    A b(1, 2, 3);       //A *this;
    a.SHow();           //const对象可以调用const成员函数
                        // a.Show();error//const对象不能调用任何非const成员函数  const A*this 不能转为 A *this 这属于权限扩大
    b.SHow();           //非const对象可以调用const成员函数 A *this  ---> const A*this 权限可以缩小
    return 0;
}
